﻿#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include<QtPrintSupport>
#include <QMainWindow>
#include<QMenuBar>
#include<QAction>
#include<array>
#include<QToolBar>
#include<QPlainTextEdit>
#include<QFileInfo>
#include<QStatusBar>
#include<QLabel>
#include<QDropEvent>
#include <QDragEnterEvent>
#include<QSharedPointer> // qt 的智能能指针模板
#include"FindDialog.h"
#include<memory>


/*
 * 打开文件之前 判断是否存在要保存的文件
 * 如果 存在已经更改过的文件， 弹出一个 对话框让 用户是否保存 当前的文件
 *              对话框 按钮 有 Yes | No | Cancel
 *
 * 如果 用户选择 Yes  判断是否是已经存在的文件路径，
 *                  如果当前的文件路径存在。直接保存文件
 *                      如果文件路径不存在， 让用户命名一个新的文件名
 *
 * 如果用户选择 No   直接丢弃当前的文件，，显示要代开的文件的内容
 *
 *
 * 如果用户选择 Cancel ， 什么也不做
 *
 *
 */

/*
 *
 *
 *
 *
 */
class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    void openFileToEdit(QString path);        // 打开文件的操作
    void preEditChange();                    // 在带开一个新文件之前的操作
    MainWindow(QWidget *parent = 0);                                 //私有的构造函数
    bool construct();                                                // 初始化
    bool initilalMenu();                                            // 初始化菜单栏
    // 生成Action
    bool makeAction(QAction *&action,QWidget * parent,QString tips,
                    const QString icon);                             //生成一些action

    bool makeAction(QAction *&action,QWidget * parent,QString text,
                    int key);                                        //生成一些action

    bool initialFile(QMenuBar *mb,const QString menuName);           // 初始化文件的菜单
    bool initialEdit(QMenuBar *mb,const QString menuName);           // 初始化 编辑的菜单按钮
    bool initialFormat(QMenuBar *mb,const QString menuName);         // 初始化格式的菜单按钮
    bool initialView(QMenuBar *mb,const QString menuName);           // 初始化视图的菜单按钮
    bool initialHelp(QMenuBar *mb,const QString menuName);            // 初始化 帮助的菜单按钮


    bool initialToolBar();                                           // 初始化工具栏 （图标的单位）
    bool initialFileToolBar(QToolBar *tb);                           // 初始化文件的toolBar
    bool initialEditToolBar(QToolBar*tb);                            // 初始化 编辑的ToolBar
    bool initialFormatToolBar(QToolBar *tb);                          // 初始化格式的ToolBar
    bool initialViewToolBar(QToolBar *tb);                            // 初始化视图的toolBar

    bool initialStutusBar();                                          // 初始化 状态的 bar



    QString showFileDialog(QFileDialog::AcceptMode mode,QString title);  // 打开一个 提示的对话框
    void showErrorMessage(QString msg);                                  //输出一个错误的信息
    bool initialMianEdit();                                              //初始化 mainEdit

    int showQuoteMessage(QString msg);                                  //打开一个问 答的对话框

    void changeFileStutus();                                           //文本状态改变

    QString saveCurrentData(QString path);                             //保留当前的文本内容

    QStatusBar m_sb;												 // 用来状态栏
    bool m_sbChange;												 // 保存光标
    QLabel m_word;
    QLabel m_label;													 //=new QLabel("ln:1 -- col:1",this);
    QPlainTextEdit m_edit;
    QString m_file;
 std::shared_ptr< FindDialog>m_pFindDlg;						//智能指针

    bool m_isTextChange;											 // 设置文本 框的数据是否繁盛变化

    QAction *  findMenuBarAction(QString text);						 //查找 菜单的action
    QAction *findToolBarAction(QString text);						// 查找工具的action
public:
    // 静态的获取对象的 工厂函数
    static MainWindow *getNewInstance();							 //生成 MainWindow 的工厂

    ~MainWindow(); // 析构函数

private slots:
    void onFileOpen();											 // 触发 fileOpen的操作
    void onFileSave();                          //
    void onFileSaveAs();
    void onFileNew();
    void onTextChange();
    void cursorChange();

    void closeEvent(QCloseEvent *e);						  // 重写的closeEvent

    void onCopyAvailable(bool re);
    void onUndoAvailable(bool re);
    void onRedoAvailable(bool re);

    void onFilePrint();
    void onFontChange();

	void onCursorPositionChange();						 // 光标的位置发生变化的fan应；
    void onEditDelete();                //
    void onFileExit();                  // 文件退出得处理
    void onFindEdit();                  // 文本查找
    void onStatusVisual();             //设置状态栏是否可见
protected:
    // 重写拖放事件
    void dragEnterEvent(QDragEnterEvent *e);


    virtual void dropEvent(QDropEvent *e) override;

};

#endif // MAINWINDOW_H
